'''
bug状态
1 处理
2 关闭
3 回归
4 延迟

bug难度分3级
1最难
2 中等
3 容易bug
###
'''


import pymysql
import dbutils
import c_account

#参数


#获取用户输入
#输入项目维度 /开发维度
    #开始终止时间 YYYY-MM--DD  YYYY-MM--DD 这种格式
def menu():
    print('================bug统计脚本=====================')
    print('0) 注册账号')
    print('1) 登录系统')

    print('2）项目维度，按时间（时间可自定义）统计新增bug、关闭bug、待回归bug等；')
    print('3）项目维度，按时间（时间可自定义）统计新增一、二级新增bug、关闭bug、待回归bug等；')
    print('4）项目维度，按时间（时间可自定义），按照一定时间颗粒度（时间可自定义），绘制新增bug增长曲线和关闭曲线；')
    print('5）项目维度，按时间（时间可自定义），按照一定时间颗粒度（时间可自定义），绘制全部bug增长曲线和关闭曲线；')
    print('6）开发维度，按时间（时间可自定义）统计新增bug、关闭bug、待回归bug等；')
    print('7）开发维度，按时间（时间可自定义）统计新增一、二级新增bug、关闭bug、待回归bug等；')
    print('8）开发维度，按时间（时间可自定义），按照一定时间颗粒度（时间可自定义），绘制新增bug增长曲线和关闭曲线；')
    print('9）开发维度，按时间（时间可自定义），按照一定时间颗粒度（时间可自定义），绘制全部bug增长曲线和关闭曲线；')
    print('10）开发维度，按时间（时间可自定义）统计软件自测考量：相比较这段时间产生的所有bug，易bug产生比率；')
    print('11）开发维度，按时间（时间可自定义）统计bug解决的及时性考量：一二级bug一定时间内（可自定义）的解决率，三四级bug一定时间内（可自定义时间）')
    print('12）开发维度，按时间（时间可自定义），按照一定时间颗粒度（时间可自定义），绘制易bug产生比率曲线；')
    print('13）开发维度，按时间（时间可自定义），按照一定时间颗粒度（时间可自定义），绘制一二级bug解决及时率曲线和三四级bug解决及时率曲线。')

def user_input():


    #项目名称
    project = input("请输入项目：")
    print('用户选的项目：===', project)

    #日期
    search_date_start = input("请输入查询的开始日期：格式 YYYY-MM--DD  YYYY-MM--DD ")
    print('用户选的开始日期：===',search_date_start)

    search_date_stop = input("请输入查询的结束日期：格式 YYYY-MM--DD  YYYY-MM--DD ")
    print('用户选的结束日期：===', search_date_stop)

    #返回列表 (项目， 查询日期)
    return [project, search_date_start, search_date_stop]

#开发维度输入
def user_input_developer():


    #开发
    developer = input("请输入开发者名称：")
    print('用户选的项目：===', developer)

    #日期
    search_date_start = input("请输入查询的开始日期：格式 YYYY-MM--DD  YYYY-MM--DD ")
    print('用户选的开始日期：===',search_date_start)

    search_date_stop = input("请输入查询的结束日期：格式 YYYY-MM--DD  YYYY-MM--DD ")
    print('用户选的结束日期：===', search_date_stop)

    #返回列表 (项目， 查询日期)
    return [developer, search_date_start, search_date_stop]

#2 ）
def count_bug_by_project_and_date():
    #先获取用户输入的数据，是一个 列表
    user_input_args_list = user_input() #list
    user_choose_project = user_input_args_list[0]
    user_choose_datefrom = user_input_args_list[1]
    user_choose_dateto = user_input_args_list[2]
    print('用户输入项目，起始时间，结束时间：==',user_choose_project, user_choose_datefrom, user_choose_dateto)

    #查询数据库，返回的是一个list(第一位状态码，第二位查询结果=tuple)，多重count()查询不好用
    sql = 'SELECT COUNT(bug_status=1 OR NULL),COUNT(bug_status=2 OR NULL),COUNT(bug_status=3 OR NULL) FROM bugcount.buglist where project = %s and (bug_submit_date between %s and %s)'

    sql_arg1 = user_choose_project
    sql_arg2 = user_choose_datefrom
    sql_arg3 = user_choose_dateto

    sql_result = dbutils.execute_db_onesql(sql, sql_arg1, sql_arg2, sql_arg3)
    if sql_result[0] == 200:
        print('功能1 .查询成功')
        #获取查询数据
        sql_result_list = sql_result[1]
        print('功能2 查询结果：==', sql_result_list)
        bug_newadd_num = sql_result_list[0][0]  #新增
        bug_closed_num = sql_result_list[0][1]  #关闭bug
        bug_return_num = sql_result_list[0][2]  #待回归bug
        print('查询结果：新增bug/关闭bug/待回归bug===', bug_newadd_num, bug_closed_num, bug_return_num)

    else:
        print('功能1 .查询失败')


# 3） 统计12级bug数量

def count_bug_by_project_and_date_buglevel_12():
    #先获取用户输入的数据，是一个 列表
    user_input_args_list = user_input() #list
    user_choose_project = user_input_args_list[0]
    user_choose_datefrom = user_input_args_list[1]
    user_choose_dateto = user_input_args_list[2]
    print('用户输入项目，起始时间，结束时间：==',user_choose_project, user_choose_datefrom, user_choose_dateto)

    #查询数据库，返回的是一个list(第一位状态码，第二位查询结果=tuple)，多重count()查询不好用
    sql = 'SELECT COUNT(bug_status=1 OR NULL),COUNT(bug_status=2 OR NULL),COUNT(bug_status=3 OR NULL) FROM bugcount.buglist where project = %s and (bug_submit_date between %s and %s) and severity_level <=2'

    sql_arg1 = user_choose_project
    sql_arg2 = user_choose_datefrom
    sql_arg3 = user_choose_dateto

    sql_result = dbutils.execute_db_onesql(sql, sql_arg1, sql_arg2, sql_arg3)
    if sql_result[0] == 200:
        print('功能1 .查询成功')
        #获取查询数据
        sql_result_list = sql_result[1]
        print('功能2 查询结果：==', sql_result_list)
        bug_newadd_num = sql_result_list[0][0]  #新增
        bug_closed_num = sql_result_list[0][1]  #关闭bug
        bug_return_num = sql_result_list[0][2]  #待回归bug
        print('查询结果：新增bug/关闭bug/待回归bug===', bug_newadd_num, bug_closed_num, bug_return_num)

    else:
        print('功能1 .查询失败')

print('4）项目维度，按时间（时间可自定义），按照一定时间颗粒度（时间可自定义），绘制新增bug增长曲线和关闭曲线；')
# 新增/总数（每天）
# 关闭/总数（每天）
def count_bug_by_project_and_date_growth_rate():
    #先获取用户输入的数据，是一个 列表
    user_input_args_list = user_input() #list
    user_choose_project = user_input_args_list[0]
    user_choose_datefrom = user_input_args_list[1]
    user_choose_dateto = user_input_args_list[2]
    print('用户输入项目，起始时间，结束时间：==',user_choose_project, user_choose_datefrom, user_choose_dateto)

    #查询数据库，返回的是一个list(第一位状态码，第二位查询结果=tuple)，多重count()查询不好用
    # sql = 'SELECT COUNT(bug_status),COUNT(bug_status=1 OR NULL),COUNT(bug_status=2 OR NULL) FROM bugcount.buglist where project = %s and (bug_submit_date between %s and %s)'
    sql = 'SELECT COUNT(bugid),COUNT(bug_status=1 OR NULL),COUNT(bug_status=2 OR NULL),bug_submit_date FROM bugcount.buglist where project = %s and (bug_submit_date between %s and %s) group by bug_submit_date;'
    sql_arg1 = user_choose_project
    sql_arg2 = user_choose_datefrom
    sql_arg3 = user_choose_dateto

    sql_result = dbutils.execute_db_onesql(sql, sql_arg1, sql_arg2, sql_arg3)
    if sql_result[0] == 200:
        print('功能4 .查询成功')
        #获取查询数据
        sql_result_list = sql_result[1]
        print('功能4 查询结果：==', sql_result_list)
        sql_result_list_length = len(sql_result_list)
        print('列表长度===', sql_result_list_length)
        print('[0]=', sql_result_list[0])
        print('[0]type[0]=', type(sql_result_list[0]))

        #汇总每天的量，进行画图
        for i in sql_result_list:
            bug_count = 0
            bug_newadd_num = 0
            bug_closed_num = 0

            #获取的数量
            # current_day = sql_result_list[i][3]
            current_day_bug_num = sql_result_list[i][0]
            current_day_bug__newadd_num = sql_result_list[i][1]
            current_day_bugcloee_num = sql_result_list[i][2]

            print('每天汇总数 ： 日期：bug总数/ 新增数量 /关闭数量')
            bug_count += current_day_bug_num
            bug_newadd_num += current_day_bug__newadd_num
            bug_closed_num += current_day_bugcloee_num
            print(current_day, bug_count, bug_newadd_num, bug_closed_num)

        bug_newadd_num = sql_result_list[0][0]  #新增
        bug_closed_num = sql_result_list[0][1]  #关闭bug
        bug_return_num = sql_result_list[0][2]  #待回归bug
        print('查询结果：新增bug/关闭bug/待回归bug===', bug_newadd_num, bug_closed_num, bug_return_num)

    else:
        print('功能1 .查询失败')

#把所有数量都找出来，然后安装时间间隔显示点数

#6 ） 开发维度，统计bug
def count_bug_by_developer_and_date():
    #先获取用户输入的数据，是一个 列表
    user_input_args_list = user_input_developer() #list
    user_choose_developer = user_input_args_list[0]
    user_choose_datefrom = user_input_args_list[1]
    user_choose_dateto = user_input_args_list[2]
    print('用户输入开发者，起始时间，结束时间：==',user_choose_developer, user_choose_datefrom, user_choose_dateto)

    #查询数据库，返回的是一个list(第一位状态码，第二位查询结果=tuple)，多重count()查询不好用
    sql = 'SELECT COUNT(bug_status=1 OR NULL),COUNT(bug_status=2 OR NULL),COUNT(bug_status=3 OR NULL) FROM bugcount.buglist where developer = %s and (bug_submit_date between %s and %s)'

    sql_arg1 = user_choose_developer
    sql_arg2 = user_choose_datefrom
    sql_arg3 = user_choose_dateto

    sql_result = dbutils.execute_db_onesql(sql, sql_arg1, sql_arg2, sql_arg3)
    if sql_result[0] == 200:
        print('功能1 .查询成功')
        #获取查询数据
        sql_result_list = sql_result[1]
        print('功能2 查询结果：==', sql_result_list)
        bug_newadd_num = sql_result_list[0][0]  #新增
        bug_closed_num = sql_result_list[0][1]  #关闭bug
        bug_return_num = sql_result_list[0][2]  #待回归bug
        print('查询结果：新增bug/关闭bug/待回归bug===', bug_newadd_num, bug_closed_num, bug_return_num)

    else:
        print('功能1 .查询失败')

#7 ） 开发维度，统计1-2bug
def count_bug_by_developer_and_date_buglevel_12():
    #先获取用户输入的数据，是一个 列表
    user_input_args_list = user_input_developer() #list
    user_choose_developer = user_input_args_list[0]
    user_choose_datefrom = user_input_args_list[1]
    user_choose_dateto = user_input_args_list[2]
    print('用户输入开发者，起始时间，结束时间：==',user_choose_developer, user_choose_datefrom, user_choose_dateto)

    #查询数据库，返回的是一个list(第一位状态码，第二位查询结果=tuple)，多重count()查询不好用
    sql = 'SELECT COUNT(bug_status=1 OR NULL),COUNT(bug_status=2 OR NULL),COUNT(bug_status=3 OR NULL) FROM bugcount.buglist where developer = %s and (bug_submit_date between %s and %s) and severity_level <=2'

    sql_arg1 = user_choose_developer
    sql_arg2 = user_choose_datefrom
    sql_arg3 = user_choose_dateto

    sql_result = dbutils.execute_db_onesql(sql, sql_arg1, sql_arg2, sql_arg3)
    if sql_result[0] == 200:
        print('功能1 .查询成功')
        #获取查询数据
        sql_result_list = sql_result[1]
        print('功能2 查询结果：==', sql_result_list)
        bug_newadd_num = sql_result_list[0][0]  #新增
        bug_closed_num = sql_result_list[0][1]  #关闭bug
        bug_return_num = sql_result_list[0][2]  #待回归bug
        print('查询结果：新增bug/关闭bug/待回归bug===', bug_newadd_num, bug_closed_num, bug_return_num)

    else:
        print('功能1 .查询失败')

#10）开发维度，按时间（时间可自定义）统计软件自测考量：相比较这段时间产生的所有bug，易bug产生比率；
def count_bug_by_developer_and_date_bug_difficulty():
    #先获取用户输入的数据，是一个 列表
    user_input_args_list = user_input_developer() #list
    user_choose_developer = user_input_args_list[0]
    user_choose_datefrom = user_input_args_list[1]
    user_choose_dateto = user_input_args_list[2]
    print('用户输入开发者，起始时间，结束时间：==',user_choose_developer, user_choose_datefrom, user_choose_dateto)

    #查询数据库，返回的是一个list(第一位状态码，第二位查询结果=tuple)，多重count()查询不好用
    sql = 'SELECT COUNT(*),COUNT(bug_difficulty=3 OR NULL) FROM bugcount.buglist where developer = %s and (bug_submit_date between %s and %s)'

    sql_arg1 = user_choose_developer
    sql_arg2 = user_choose_datefrom
    sql_arg3 = user_choose_dateto

    sql_result = dbutils.execute_db_onesql(sql, sql_arg1, sql_arg2, sql_arg3)
    if sql_result[0] == 200:
        print('功能1 .查询成功')
        #获取查询数据
        sql_result_list = sql_result[1]
        print('功能2 查询结果：==', sql_result_list)
        bug_all_for_developer = sql_result_list[0][0]  #新增
        bug_easy_num = sql_result_list[0][1]  #容易bug
        print('查询结果：总bug/容易bug===', bug_all_for_developer, bug_easy_num)
        print('容易bug发生率=====', bug_easy_num/bug_all_for_developer * 100, ' %')

    else:
        print('功能1 .查询失败')


#11）开发维度，按时间（时间可自定义）统计bug解决的及时性考量：一二级bug一定时间内（可自定义）的解决率，三四级bug一定时间内（可自定义时间）
def count_bug_by_developer_and_date_bug_ontime_rate():
    #先获取用户输入的数据，是一个 列表
    user_input_args_list = user_input_developer() #list
    user_choose_developer = user_input_args_list[0]
    user_choose_datefrom = user_input_args_list[1]
    user_choose_dateto = user_input_args_list[2]
    print('用户输入开发者，起始时间，结束时间：==',user_choose_developer, user_choose_datefrom, user_choose_dateto)

    #查询数据库，返回的是一个list(第一位状态码，第二位查询结果=tuple)，多重count()查询不好用
    sql = 'SELECT COUNT(*),COUNT(severity_level<=2 OR NULL),COUNT(severity_level>2 OR NULL) FROM bugcount.buglist where developer = %s and (bug_submit_date between %s and %s)'

    sql_arg1 = user_choose_developer
    sql_arg2 = user_choose_datefrom
    sql_arg3 = user_choose_dateto

    sql_result = dbutils.execute_db_onesql(sql, sql_arg1, sql_arg2, sql_arg3)
    if sql_result[0] == 200:
        print('功能1 .查询成功')
        #获取查询数据
        sql_result_list = sql_result[1]
        print('功能2 查询结果：==', sql_result_list)
        bug_all_for_developer = sql_result_list[0][0]  #新增
        bug_difficult_num = sql_result_list[0][1]  #12级别bug
        bug_easy_num = sql_result_list[0][2]  # 12级别bug

        print('查询结果：总bug/容易bug===', bug_all_for_developer, bug_easy_num)
        print('12等级bug解决率=====', bug_difficult_num / bug_all_for_developer * 100, ' %')
        print('34等级bug解决率=====', bug_easy_num / bug_all_for_developer * 100, ' %')
    else:
        print('功能1 .查询失败')

if __name__=='__main__':
    menu()
    #获取用户输入
    user_choose_num = int(input("请输入序号："))
    print('type(user_choose_num)==', type(user_choose_num))
    if user_choose_num == 0:
        print('用户选择了0：注册账号')
        c_account.register()
    elif user_choose_num == 1:
        print('用户选择了1：登录系统')
        c_account.login()
    elif user_choose_num == 2:
        print('用户选择了2：2）项目维度，按时间（时间可自定义）统计新增bug、关闭bug、待回归bug等')
        count_bug_by_project_and_date()
    elif user_choose_num == 3:
        print('用户选择了3：3）项目维度，按时间（时间可自定义）统计1-2 级新增bug、关闭bug、待回归bug等')
        count_bug_by_project_and_date_buglevel_12()
    elif user_choose_num == 4:
        print('4）项目维度，按时间（时间可自定义），按照一定时间颗粒度（时间可自定义），绘制新增bug增长曲线和关闭曲线')
        count_bug_by_project_and_date_growth_rate()

    elif user_choose_num == 5:
        pass
    elif user_choose_num == 6:
        print('用户选择了6：6）开发维度，按时间（时间可自定义）统计 级新增bug、关闭bug、待回归bug等')
        count_bug_by_developer_and_date()

    elif user_choose_num == 7:
        print('用户选择了7）开发维度，按时间（时间可自定义）统计1-2 级新增bug、关闭bug、待回归bug等')
        count_bug_by_developer_and_date_buglevel_12()

    elif user_choose_num == 8:
        pass
    elif user_choose_num == 9:
        pass
    elif user_choose_num == 10:
        print('用户选择了 10）开发维度，按时间（时间可自定义）统计软件自测考量：相比较这段时间产生的所有bug，易bug产生比率')
        # 10）开发维度，按时间（时间可自定义）统计软件自测考量：相比较这段时间产生的所有bug，易bug产生比率；
        count_bug_by_developer_and_date_bug_difficulty()

    elif user_choose_num == 11:
        print('选了了 #11）开发维度，按时间（时间可自定义）统计bug解决的及时性考量：一二级bug一定时间内（可自定义）的解决率，三四级bug一定时间内（可自定义时间）')
        count_bug_by_developer_and_date_bug_ontime_rate()

    elif user_choose_num == 12:
        pass
    else:
        pass

    #数据库操作
    #dbutils.withDB("show databases", "show databases")
    # c_account.register()
    #funcD(1,2,3)
    # # sql = 'insert into bugcount.user values(null, "root", "pass", %s, %s, null, null)'
    # sql = 'select username, password from bugcount.user where username = "admin"'
    #
    # # args = '118@123.com'
    # # args2 = '118@123.com'
    # flag = dbutils.execute_db_onesql(sql)
    # print('ssss==', flag) #成功标识
    # c_account.register()
    # c_account.login()
